/**
  ******************************************************************************
  * @file           : tm1650.h
  * @brief          : Header for usart.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TM1650_H__
#define __TM1650_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "xl32f003xx_ll_Start_Kit.h"

#define  KEY_DOWN_TIME     500          //5S 单位 10ms
#define  MAX_DOWN_CNT      12          //按下最大计数
/* Private includes ----------------------------------------------------------*/
typedef struct{
    uint8_t  buff[20] ;             //按键发送缓存
    uint8_t  down_flag[10];         //按下标志位
    uint8_t  cnt;                   //按键按下计数
    uint8_t  time_out_flag;         //超时标志位
    uint8_t  sent_flag;             //确认发送标志
    uint16_t down_time;             //按键按下定时
    uint16_t scan_time;             //按键扫描时间
}keybuff_typedef;

extern keybuff_typedef keydata;
/* Private includes ----------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

//==========【配置IIC驱动引脚】========
 
//配置驱动SCL的gpio为开漏输出模式
#define  TM1650_IIC_SCL_MODE_OD   \
do{ \
    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_3,LL_GPIO_MODE_OUTPUT); \
    LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_3); \
}while(0)
 
//配置驱动SDA的gpio为开漏输出模式
#define  TM1650_IIC_SDA_MODE_OD  \
do{ \
    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_2,LL_GPIO_MODE_OUTPUT); \
    LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_2); \
}while(0)
 
//=====================================
 
                                    
//========【配置IIC总线的信号读写和时序】=======
//主机拉高SCL
#define TM1650_IIC_SCL_HIGH     LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_3)
 
//主机拉低SCL
#define TM1650_IIC_SCL_LOW      LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_3)
 
 
//主机拉高SDA
#define TM1650_IIC_SDA_HIGH     LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_2)
 
//主机拉低SDA
#define TM1650_IIC_SDA_LOW      LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_2)
 
//参数b为0时主机拉低SDA，非0则拉高SDA
#define TM1650_IIC_SDA_WR(b)    do{                                       \
                               if(b) LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_2); \
                               else  LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_2); \
                              }while(0)
 
 
//主机读取SDA线电平状态，返回值为0为低电平，非0则为高电平
#define TM1650_IIC_SDA_RD()    LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_2) 
 
//软件延时2us
#define TM1650_IIC_DELAY_2US   do{for(int ii_=0;ii_<22;ii_++);}while(0)
 
//软件延时4us
#define TM1650_IIC_DELAY_4US   do{for(int ii_=0;ii_<40;ii_++);}while(0)
//================================
 

/* Exported constants --------------------------------------------------------*/
//命令宏定义区---------------------------开始*/
#define COMMAND_SET_PARAMETER       0x48 //设置系统参数命令
#define COMMAND_READ_KEY_DATA       0x49 //读取按键数据命令
//命令宏定义区---------------------------结束*/

//参数宏定义区---------------------------开始*/
#define PARAMETER_BRIGHTNESS_NORMAL 0x00     /*关闭LED显示*/
#define PARAMETER_BRIGHTNESS_ONE    0x10      /*一级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_TWO    0x20      /*二级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_THREE  0x30      /*三级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_FOUR   0x40      /*四级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_FIVE   0x60      /*五级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_SIX    0x60      /*六级亮度，打开LED显示*/
#define PARAMETER_BRIGHTNESS_SEVEN  0x70      /*七级亮度，打开LED显示*/

#define PARAMETER_SEGMENT_MODE_EIGHT 0x00    //8段输出（默认）
#define PARAMETER_SEGMENT_MODE_SEVEN 0x08    //7段输出，用于键盘读出时，16脚DP/KP为键盘扫描标识输出
                                             //  7段模式且开屏时（48H+09H）：
                                             //    在没有按键按下时DP/KP脚输出高电平
                                             //    在有按键按下时，DP/KP脚会输出低电平
                                             //    当下一次按键数据被读取后（或关屏）DP/KP脚输出高电平
                                             //    KP可以用作是否有按键的指示，连接MCU的外部中断脚
#define PARAMETER_WORK_MODE_RUNNING  0x00    //正常工作模式
#define PARAMETER_WORK_MODE_STANDBY  0x04    //待机工作模式

#define PARAMETER_DISPLAY_DIG1       0x68    //显示地址 DIG1
#define PARAMETER_DISPLAY_DIG2       0x6A    //显示地址 DIG2
#define PARAMETER_DISPLAY_DIG3       0x6C    //显示地址 DIG3
#define PARAMETER_DISPLAY_DIG4       0x6E    //显示地址 DIG4

#define PARAMETER_DISPLAY_MODE_OFF   0x00      //关闭屏显示
#define PARAMETER_DISPLAY_MODE_ON    0x01      //打开屏显示
                                             //  当发送开屏命令且为正常工作模式时，DIG1-DIG4开始进行扫描
                                              //  所以，读键盘时也需要开屏
//参数宏定义区---------------------------结束*/

//数码管位选
#define TM1650_DIG1     0
#define TM1650_DIG2     1
#define TM1650_DIG3     2
#define TM1650_DIG4     3

/***********按键数值定义******************/

#define KEY0_PRES       0xF2       //KEY0  
#define KEY1_PRES       0x2A       //KEY1 
#define KEY2_PRES       0x32       //KEY2  
#define KEY3_PRES       0x22       //KEY3 
#define KEY4_PRES       0xAA       //KEY4  
#define KEY5_PRES       0xB2       //KEY5 
#define KEY6_PRES       0xA2       //KEY6  
#define KEY7_PRES       0x6A       //KEY7 
#define KEY8_PRES       0x72       //KEY8  
#define KEY9_PRES       0x62       //KEY9 

#define KEY_ENTER       0xEA       //确认 *
#define KEY_CANCEL      0xE2       //取消 #

/*******************END**************/
void TM1650_task(void);
void TM1650_init(void);
void TM1650_cfg_display(uint8_t param);
void TM1650_clear(void);
void TM1650_print(uint8_t dig,uint8_t seg_data);

void TM1650_Time_Task(void);
uint8_t TM1650_KEY_Scan(void);
/* Exported macro ------------------------------------------------------------*/

/* Exported functions prototypes ---------------------------------------------*/


/* Private defines -----------------------------------------------------------*/
#ifdef __cplusplus
}
#endif

#endif /* __tm1650_H */

/************************ (C) COPYRIGHT Xinling *****END OF FILE****/

